베르누이의 경우 실습 예제


In [1]:
X = np.array([[1,0,0],[1,1,1], [0,1,1],[0,1,0],[0,0,1],[1,1,1]])
y0 = np.zeros(2)
y1 = np.ones(4)
y = np.hstack([y0, y1])
print(X)
print(y)


[[1 0 0]
 [1 1 1]
 [0 1 1]
 [0 1 0]
 [0 0 1]
 [1 1 1]]
[ 0.  0.  1.  1.  1.  1.]

In [2]:
from sklearn.naive_bayes import BernoulliNB
clf_bern = BernoulliNB().fit(X, y)

In [3]:
clf_bern.classes_


Out[3]:
array([ 0.,  1.])

In [4]:
clf_bern.class_count_


Out[4]:
array([ 2.,  4.])

In [5]:
fc = clf_bern.feature_count_
fc


Out[5]:
array([[ 2.,  1.,  1.],
       [ 1.,  3.,  3.]])

In [6]:
fc / np.repeat(clf_bern.class_count_[:, np.newaxis], 3, axis=1)


Out[6]:
array([[ 1.  ,  0.5 ,  0.5 ],
       [ 0.25,  0.75,  0.75]])

In [7]:
x_new = np.array([1,1,0])

In [8]:
clf_bern.predict_proba([x_new])


Out[8]:
array([[ 0.55862069,  0.44137931]])

In [24]:
np.exp(clf_bern.feature_log_prob_)


Out[24]:
array([[ 0.75      ,  0.5       ,  0.5       ],
       [ 0.33333333,  0.66666667,  0.66666667]])

In [25]:
theta = np.exp(clf_bern.feature_log_prob_)  #자동적으로 스무딩
theta


Out[25]:
array([[ 0.75      ,  0.5       ,  0.5       ],
       [ 0.33333333,  0.66666667,  0.66666667]])

In [27]:
p = ((theta**x_new)*(1-theta)**(1-x_new)).prod(axis=1)*np.exp(clf_bern.class_log_prior_)
p / p.sum()


Out[27]:
array([ 0.55862069,  0.44137931])

X값 살짝 바뀐 경우(스무딩을 써야 하는 경우)


In [28]:
X1 = np.array([[1,0,0],[1,0,1], [0,1,1],[0,1,0],[0,0,1],[1,1,1]])
y01 = np.zeros(2)
y11 = np.ones(4)
y1 = np.hstack([y01, y11])

In [29]:
clf_bern1 = BernoulliNB().fit(X1, y1)

In [30]:
fc1 = clf_bern1.feature_count_
fc1


Out[30]:
array([[ 2.,  0.,  1.],
       [ 1.,  3.,  3.]])

In [31]:
np.repeat(clf_bern1.class_count_[:, np.newaxis], 3, axis=1)


Out[31]:
array([[ 2.,  2.,  2.],
       [ 4.,  4.,  4.]])

In [32]:
fc1 / np.repeat(clf_bern1.class_count_[:, np.newaxis], 3, axis=1)


Out[32]:
array([[ 1.  ,  0.  ,  0.5 ],
       [ 0.25,  0.75,  0.75]])

In [33]:
clf_bern1.predict_proba([x_new])


Out[33]:
array([[ 0.38755981,  0.61244019]])

In [35]:
np.exp(clf_bern1.feature_log_prob_)


Out[35]:
array([[ 0.75      ,  0.25      ,  0.5       ],
       [ 0.33333333,  0.66666667,  0.66666667]])

In [36]:
theta = np.exp(clf_bern1.feature_log_prob_) 
theta


Out[36]:
array([[ 0.75      ,  0.25      ,  0.5       ],
       [ 0.33333333,  0.66666667,  0.66666667]])

In [37]:
p = ((theta**x_new)*(1-theta)**(1-x_new)).prod(axis=1)*np.exp(clf_bern1.class_log_prior_)
p / p.sum()


Out[37]:
array([ 0.38755981,  0.61244019])

다항의 경우 실습 예제


In [38]:
X = np.array([[4,4,2],[4,3,3], [6,3,1],[4,6,0],[0,4,1],[1,3,1],[1,1,3],[0,3,2]])
y0 = np.zeros(4)
y1 = np.ones(4)
y = np.hstack([y0, y1])
print(X)
print(y)


[[4 4 2]
 [4 3 3]
 [6 3 1]
 [4 6 0]
 [0 4 1]
 [1 3 1]
 [1 1 3]
 [0 3 2]]
[ 0.  0.  0.  0.  1.  1.  1.  1.]

In [39]:
from sklearn.naive_bayes import MultinomialNB
clf_mult = MultinomialNB().fit(X, y)

In [40]:
clf_mult.classes_


Out[40]:
array([ 0.,  1.])

In [41]:
clf_mult.class_count_


Out[41]:
array([ 4.,  4.])

In [42]:
fc = clf_mult.feature_count_
fc


Out[42]:
array([[ 18.,  16.,   6.],
       [  2.,  11.,   7.]])

In [43]:
np.repeat(fc.sum(axis=1)[:, np.newaxis], 3, axis=1)


Out[43]:
array([[ 40.,  40.,  40.],
       [ 20.,  20.,  20.]])

In [44]:
fc / np.repeat(fc.sum(axis=1)[:, np.newaxis], 3, axis=1)


Out[44]:
array([[ 0.45,  0.4 ,  0.15],
       [ 0.1 ,  0.55,  0.35]])

In [45]:
clf_mult.alpha


Out[45]:
1.0

In [46]:
(fc + clf_mult.alpha) / (np.repeat(fc.sum(axis=1)[:, np.newaxis], 3, axis=1) + clf_mult.alpha * X.shape[1])


Out[46]:
array([[ 0.44186047,  0.39534884,  0.1627907 ],
       [ 0.13043478,  0.52173913,  0.34782609]])

In [47]:
np.repeat(fc.sum(axis=1)[:, np.newaxis], 3, axis=1) + clf_mult.alpha * X.shape[1]


Out[47]:
array([[ 43.,  43.,  43.],
       [ 23.,  23.,  23.]])

In [48]:
x_new1 = np.array([1,1,1])
clf_mult.predict_proba([x_new1])


Out[48]:
array([[ 0.54574281,  0.45425719]])

In [49]:
x_new2 = np.array([2,2,2])
clf_mult.predict_proba([x_new2])


Out[49]:
array([[ 0.59072628,  0.40927372]])

In [50]:
x_new3 = np.array([3,3,3])
clf_mult.predict_proba([x_new3])


Out[50]:
array([[ 0.63424066,  0.36575934]])

In [ ]:

문제1

  • feature와 target이 다음과 같을 때, 베르누이 나이브 베이지안 방법을 사용하여 다음 문제를 푸세요.

In [51]:
X = np.array([
        [1, 0, 0],
        [1, 0, 1],
        [0, 0, 1],
        [0, 0, 0],
        [1, 1, 1],
        [0, 1, 1],
        [0, 0, 1],
        [0, 1, 0],
    ])
y = np.array([0,0,0,0,1,1,1,1])

(1) 사전 분포(prior) p(y)를 구하세요.

  • p(y=0) = 0.5
  • p(y=1) = 0.5

In [52]:
py0, py1 = (y==0).sum()/len(y), (y==1).sum()/len(y)
py0, py1


Out[52]:
(0.5, 0.5)

(2) 스무딩 벡터 알파=0 일 때, 다음 x_new에 대해 우도(likelihood)함수 p(x|y)를 구하고 조건부 확률 분포 p(y|x)를 구하세요.(normalize 된 값이 아님!)

  • x_new = [1 1 0]


In [56]:
x_new = np.array([1, 1, 0])

In [58]:
theta0 = X[y==0, :].sum(axis=0)/len(X[y==0, :])
theta0


Out[58]:
array([ 0.5,  0. ,  0.5])

In [59]:
theta1 = X[y==1, :].sum(axis=0)/len(X[y==1, :])
theta1


Out[59]:
array([ 0.25,  0.75,  0.75])

In [60]:
likelihood0 = (theta0**x_new).prod()*((1-theta0)**(1-x_new)).prod()
likelihood0


Out[60]:
0.0

In [61]:
likelihood1 = (theta1**x_new).prod()*((1-theta1)**(1-x_new)).prod()
likelihood1


Out[61]:
0.046875

In [62]:
px = likelihood0 * py0 + likelihood1 * py1
px


Out[62]:
0.0234375

In [63]:
likelihood0 * py0 / px, likelihood1 * py1 / px


Out[63]:
(0.0, 1.0)

In [64]:
from sklearn.naive_bayes import BernoulliNB
model = BernoulliNB(alpha=0).fit(X, y)
model.predict_proba([x_new])


Out[64]:
array([[ 0.,  1.]])

(3) 스무딩 팩터 알파=0.5일 때, 문제(2)를 다시 풀어보세요.


In [67]:
theta0 = (X[y==0, :].sum(axis=0) + 0.5*np.ones(3))/(len(X[y==0,:])+1)
theta0


Out[67]:
array([ 0.5,  0.1,  0.5])

In [68]:
theta1 = (X[y==1, :].sum(axis=0) + 0.5*np.ones(3))/(len(X[y==1,:])+1)
theta1


Out[68]:
array([ 0.3,  0.7,  0.7])

In [69]:
x_new = np.array([1, 1, 0])

In [70]:
likelihood0 = (theta0**x_new).prod()*((1-theta0)**(1-x_new)).prod()
likelihood0


Out[70]:
0.025000000000000001

In [71]:
likelihood1 = (theta1**x_new).prod()*((1-theta1)**(1-x_new)).prod()
likelihood1


Out[71]:
0.063

In [72]:
px = likelihood0 * py0 + likelihood1 * py1
px


Out[72]:
0.043999999999999997

In [73]:
likelihood0 * py0 / px, likelihood1 * py1 / px


Out[73]:
(0.28409090909090912, 0.71590909090909094)

In [75]:
from sklearn.naive_bayes import BernoulliNB
model = BernoulliNB(alpha=0.5).fit(X, y)
model.predict_proba([x_new])


Out[75]:
array([[ 0.28409091,  0.71590909]])

문제2

문제 1을 다항 나이브 베이지안(Multinomial Naive Bayesian) 방법을 사용하여 (1), (2), (3)을 다시 풀어보세요

(1) 사전 분포(prior) p(y)를 구하세요.

  • p(y = 0) = 0.5
  • p(y = 1) = 0.5

(2) 스무딩 팩터 알파=0 일 때, 다음 x_new에 대해 우도(likelihood)함수 p(x|y)를 구하고 조건부 확률 분포 p(y|x)를 구하세요.(normalize 된 값이 아님!)

  • x_new = [2 3 1]


In [76]:
x_new = np.array([2, 3, 1])

In [77]:
theta0 = X[y==0, :].sum(axis=0)/X[y==0, :].sum()
theta0


Out[77]:
array([ 0.5,  0. ,  0.5])

In [78]:
theta1 = X[y==1, :].sum(axis=0)/X[y==1, :].sum()
theta1


Out[78]:
array([ 0.14285714,  0.42857143,  0.42857143])

In [79]:
likelihood0 = (theta0**x_new).prod()
likelihood0


Out[79]:
0.0

In [80]:
likelihood1 = (theta1**x_new).prod()
likelihood1


Out[80]:
0.00068848863993744083

In [81]:
px = likelihood0 * py0 + likelihood1 * py1
px


Out[81]:
0.00034424431996872042

In [82]:
likelihood0 * py0 / px, likelihood1 * py1 / px


Out[82]:
(0.0, 1.0)

In [83]:
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB(alpha=0).fit(X, y)
model.predict_proba([x_new])


Out[83]:
array([[ 0.,  1.]])

(3) 스무딩 팩터 알파=0.5일 때, 문제(2)를 다시 풀어보세요.


In [84]:
theta0 = (X[y==0, :].sum(axis=0) + 0.5*np.ones(3))/ (X[y==0, :].sum() + 1.5)
theta0


Out[84]:
array([ 0.45454545,  0.09090909,  0.45454545])

In [85]:
theta1 = (X[y==1, :].sum(axis=0) + 0.5*np.ones(3))/ (X[y==1, :].sum() + 1.5)
theta1


Out[85]:
array([ 0.17647059,  0.41176471,  0.41176471])

In [86]:
likelihood0 = (theta0**x_new).prod()
likelihood0


Out[86]:
7.0559241256722174e-05

In [87]:
likelihood1 = (theta1**x_new).prod()
likelihood1


Out[87]:
0.00089524342737249145

In [88]:
px = likelihood0 * py0 + likelihood1 * py1
px


Out[88]:
0.0004829013343146068

In [89]:
likelihood0 * py0 / px, likelihood1 * py1 / px


Out[89]:
(0.073057616787152349, 0.92694238321284772)

In [90]:
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB(alpha=0.5).fit(X, y)
model.predict_proba([x_new])


Out[90]:
array([[ 0.07305762,  0.92694238]])